<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Pixabay Image Search</title>
        <link rel="stylesheet" type="text/css" href="css/basic.css"/>
        <script type="text/javascript" src="scripts/jquery-1.6.2.min.js"></script>
        <script type="text/javascript" src="locales/locales.js"></script>
    </head>

    <body>
    <!--<p id="lang"></p>-->
    </body>

    <script type="text/javascript">
        /* 
           This script makes use of the Pixabay image search API, documented here:
           https://pixabay.com/api/docs/
        */

        var API_KEY = '2261217-168750d9eaaa0051ca20fa425';


        // Number of results per page
        var limit = 10; 

        // Maximum number of pages to display
        var maxPages = 10;

        // Minimum size of pictures to search for
        var minHeight = 150;
        var minWidth = 150;

        // Image type to retrieve. Can be "photo", "illustration", "vector" or "all".
        var imageType = "all";

        // Default language to search in, if the application can't return a suitable one
        var searchLanguage = "en";

        // Language for the widget (languages can be added in locales/locales.js)
        var locale = locales["en"];
        
        // Fetch 960px images instead of the default 640px. However the API doesn't
        // provide size information in this case, so it is disabled by default.
        var fetchMediumResImages = false;

        // ---------------------
        // Globals
        // ---------------------
        var currentIndex = 0;
        var currentTerm = "";
        var filtersDisplayed = false; 
        
        // Pixabay's supported search languages
        var availableLanguages = ['cs', 'da', 'de', 'en', 'es', 'fr', 'id', 'it', 'hu', 'nl', 'no', 
            'pl', 'pt', 'ro', 'sk', 'fi', 'sv', 'tr', 'vi', 'th', 'bg', 'ru', 'el', 'ja', 'ko', 'zh'];

        // ---------------------

        $(document).ready(loadPage)

        /* Initialize the page layout */
        function loadPage() {

            // Get OpenBoard's current language
            var appLanguage = window.sankore ? sankore.locale().substr(0,2) : searchLanguage;
            
            // Set it as search language, if possible
            if (availableLanguages.indexOf(appLanguage) > -1)
                searchLanguage = appLanguage;

            // And as the widget's language
            if (locales[searchLanguage] != undefined)
                locale = locales[searchLanguage];

            var mode = false; //search or view mode
            var hide = false; //hide or no main panel

            // basic containers and elements    
            
            var search = $("<div id='search' class='search'>").appendTo("body");

            var subSearchInput = $("<div id='subSearchInput' class='subSearch'>").appendTo(search);
            var subSearchFilter = $("<div id='subSearchFilter' class='subSearch'>").appendTo(search);

            var searchInput = $("<input id='searchInput' class='searchInput' type='text'/>").appendTo(subSearchInput);
            var searchButton = $("<div id='searchButton' class='searchButton'>").appendTo(subSearchInput);

            var toggleFilters = $("<div id='toggleFilters' class='toggleFilters'>").appendTo(subSearchInput);

            var selectFilter = $("<select id='typeFilter' class='filterSelect'>")
            .append($("<option value='all'>"+locale.def_opts_val_image+"</option>"))
            .append($("<option value='photo'>"+locale.image_type_photo+"</option>"))
            .append($("<option value='illustration'>"+locale.image_type_illustration+"</option>"))
            .append($("<option value='vector'>"+locale.image_type_vector+"</option>"))
            $("<div class='filterContainer'>").append("<span>"+locale.image_type_title+":</span><br/>").append(selectFilter).appendTo(subSearchFilter);

            var searchResult = $("<div id='searchResult'>").appendTo("body");

            var disc_nav_cont = $("<div id='disc_nav_cont' class='disc_nav_cont'>").appendTo("body");    
            var disclaimer = $("<div id='disclaimer' class='disclaimer'>"+locale.disclaimer_title+"<div>").appendTo(disc_nav_cont);

            

            // Functions
                        
            searchButton.click(function(){
                if(!hide){
                    runSearch(searchInput.val(), 0);
                }
            });
            
            searchInput.keydown(function(event){
                if(!hide){
                    if((event.keyCode == 0xA)||(event.keyCode == 0xD)){
                        runSearch(searchInput.val(), 0);
                    }
                }
            });
            
            ($(".imgContainer").live("click",function(){
                sankore.sendFileMetadata(createMetaData($(this)));
            }));


            toggleFilters.click(function(){
                if(filtersDisplayed){
                    subSearchFilter.hide();
                    toggleFilters.css("background-image","url(images/down.png)");
                    filtersDisplayed = false;
                } else {
                    subSearchFilter.css("display","inline-block");
                    toggleFilters.css("background-image","url(images/up.png)");
                    filtersDisplayed = true;
                }
            });
            
        }

        function updateFilters() {
            var value = $("#typeFilter option:selected").val();
            imageType = value;
        }

        function runSearch(term, index) {
            updateFilters();

            currentTerm = term;
            currentIndex = index;
            var page = index+1; // Page numbers start at 1 on Pixabay
            var url = "https://pixabay.com/api/?key="+API_KEY
                        +"&q="+escape(term)
                        +"&per_page="+limit
                        +"&page="+page
                        +"&min_width="+minWidth
                        +"&minHeight="+minHeight
                        +"&image_type="+imageType
                        +"&lang="+searchLanguage
                        +"&safesearch=true";

            //console.log(url);
            //document.getElementById("lang").innerHTML = "Language: " + searchLanguage;

            $.ajax({
                url: url,
                success: searchComplete,
                error: searchFail,
                dataType: "json"
            });
        }

        function searchComplete(json) {
            // Grab our content div, clear it.
            var totalResults = json.totalHits;
            var contentDiv = $('#searchResult').empty();
            // Loop through our results, printing them to the page.
            var results = json.hits;

            if (results.length == 0)
                $("<p>"+locale.no_result+"</p>").appendTo(contentDiv);

            for (var i = 0; i < results.length; i++) {
                var result = results[i];

                /* 
                   Images are displayed in an `imgContainer` element. It contains
                   the image itself (`newImg`) but also some hidden fields containing
                   metadata that is sent to OpenBoard if the user clicks the image
                */

                // Image element
                var imgContainer = $("<div class='imgContainer' draggable='true'>");
                var newImg = document.createElement('img');

                newImg.src = result.previewURL;

                var imgWidth = (result.previewWidth > minWidth)?result.previewWidth:minWidth;
                var imgHeight = (result.previewHeight > minHeight)?result.previewHeight:minHeight;
                imgContainer.width(imgWidth).height(imgHeight);
                imgContainer.append($(newImg));

                // Metadata to send to OpenBoard
                var iUrl = $("<input type='hidden'/>");
                var iContent = $("<input type='hidden'/>");
                var iHeight = $("<input type='hidden'/>");
                var iWidth = $("<input type='hidden'/>");
                var iThumbnailUrl = $("<input type='hidden'/>");
                var iTitle = $("<input type='hidden'/>");

                var imageURL = result.webformatURL;
                if (fetchMediumResImages)
                    imageURL = getMediumResURL(result);

                iUrl.attr("value", imageURL);
                iContent.attr("value", result.type);
                iHeight.attr("value", result.webformatHeight);
                iWidth.attr("value", result.webformatWidth);
                iThumbnailUrl.attr("value", result.previewURL);
                iTitle.attr("value", getImageTitle(result));
                

                imgContainer.append(iUrl);
                imgContainer.append(iContent);
                imgContainer.append(iHeight);
                imgContainer.append(iWidth);
                imgContainer.append(iThumbnailUrl);
                imgContainer.append(iTitle);

                // Add the image to the page
                imgContainer.appendTo(contentDiv);

            }
            // Now add links to additional pages of search results.
            addPaginationLinks(totalResults);
        }



        function addPaginationLinks(totalResults) {
            var curPage = currentIndex; 
            var pagesDiv = $("<div id='resultFooter' class='resultFooter'>");

            var highestPageNumber = maxPages;
            if (totalResults/limit < maxPages)
                highestPageNumber = totalResults/limit;

            for (var i = 0; i < highestPageNumber; i++) {
                var link = $("<a class='pager_button'></a>").attr('href', 'javascript:gotoPage('+i+');').html(i+1).appendTo(pagesDiv);
                if (curPage == i) 
                    link.addClass('active');
            }

            $("#disc_nav_cont #resultFooter").remove();
            pagesDiv.insertBefore($('#disclaimer'));
            
            $(".imgContainer").each(function(){
                this.addEventListener("dragstart", imageDragging, false);
            })
            
            $(".imgContainer").each(function(){
                this.addEventListener("dragenter", imageDragenter, false);
            })
            
            $(".imgContainer").each(function(){
                this.addEventListener("dragleave", imageDragleave, false);
            })
            
            $(".imgContainer").each(function(){
                this.addEventListener("dragover", imageDragover, false);
            })
        }

        function searchFail(jqXHR, textStatus, errorThrown) {
            alert('Couldn\'t connect to Pixabay: ' + textStatus + ' ' + errorThrown);
        }

         function imageDragging(e){
            e.dataTransfer.setData("text/plain",$(this).find("input:hidden").eq(0).val());
        }
        
        function imageDragleave(e){
            return false;
        }
        
        function imageDragover(e){
            return false;
        }
        
        function imageDragenter(e){
            return false;
        }
       
        function gotoPage(i) { 
            runSearch(currentTerm, i);             
        } 

        function createMetaData(parent){
            var meta = "";
            //alert($(this).find("input:hidden").eq(0).val());
            meta = "<metadata><data><key>Type</key><value>Image</value></data><data><key>Url</key><value>" + 
                parent.find("input:hidden").eq(0).val() + 
                "</value></data><data><key>Content</key><value>" + 
                parent.find("input:hidden").eq(1).val() +
                "</value></data><data><key>Height</key><value>" + 
                parent.find("input:hidden").eq(2).val() +
                "</value></data><data><key>Width</key><value>" +
                parent.find("input:hidden").eq(3).val() +
                "</value></data><data><key>thumbnailUrl</key><value>" +
                parent.find("input:hidden").eq(4).val() +
                "</value></data><data><key>Title</key><value>" +
                parent.find("input:hidden").eq(5).val() +
                "</value></data></metadata>";
            return meta;
        }
        
        function getImageTitle(image) {
            // Pixabay images don't have a title, but we can fetch the first tag and use that as a title.

            var firstTag = image.tags.split(",")[0]
            //console.log(firstTag);
            return firstTag;
        }

        function getMediumResURL(image) {
            // Pixabay automatically returns a 640px "webformat" picture; we can't request a larger one
            // in the search request, but we can manually fetch one (up to 960px)

            var url = image.webformatURL;

            medResURL = url.replace("_640.", "_960.");

            return medResURL;
        }

    </script>

</html>
